import re
import sys

from controller import StudentController
from model import StudentModel


class StudentView:
    """
    学生信息系统视图
    """

    def __init__(self):
        self.__controller = StudentController()

    def main(self):
        """
        主目录
        """
        while True:
            self.__menu()  # 显示菜单
            self.__select()

    def __menu(self):
        """
        显示菜单
        """
        print('''
            ╔———————学生信息管理系统————————╗
            │                                              │
            │   =============== 功能菜单 ===============   │
            │                                              │
            │   1 录入学生信息                             │
            │   2 查找学生信息                             │
            │   3 删除学生信息                             │
            │   4 修改学生信息                             │
            │   5 排序                                     │
            │   6 统计学生总人数                           │
            │   7 显示所有学生信息                         │
            │   0 退出系统                                 │
            │  ==========================================  │
            │  说明：通过数字键选择菜单          │
            ╚———————————————————————╝
            ''')

    def __select(self):
        option = input("请选择：")  # 选择菜单项
        option_str = re.sub("\D", "", option)  # 提取非数字 "\D":匹配option的非数字字符用‘’替换掉
        if option_str in ['0', '1', '2', '3', '4', '5', '6', '7']:
            if option_str == '0':  # 退出系统
                # print('您已退出学生成绩管理系统！')
                sys.exit("您已退出学生成绩管理系统！")
            elif option_str == '1':  # 录入学生成绩信息
                self.__insert()
            elif option_str == '2':  # 查找学生成绩信息
                self.__search()
            elif option_str == '3':  # 删除学生成绩信息
                self.__delete()
            elif option_str == '4':  # 修改学生成绩信息
                self.__modify()
            elif option_str == '5':  # 排序
                self.__sort()
            elif option_str == '6':  # 统计学生总数
                self.__total()
            elif option_str == '7':  # 显示所有学生信息
                self.__show()

    def __insert(self):
        # mark = True  # 是否继续添加
        while True:
            stu = StudentModel()
            stu.name = input("请输入名字：")
            if not stu.name:  # 名字为空，跳出循环
                break
            stu.english = self.__get_number("请输入英语成绩：")
            stu.python = self.__get_number("请输入Python成绩：")
            stu.c = self.__get_number("请输入C语言成绩：")
            student_list = self.__controller.add_student(stu)
            inputMark = input("是否继续添加？（y/n）:")
            if inputMark == "y":  # 继续添加
                self.__insert()
            else:  # 不继续添加
                break
                # mark = False
        if self.__controller.save(student_list):
            print("学生信息录入完毕！！！")
        else:
            print(self.__controller.save(student_list))

    '''2 查找学生成绩信息'''

    def __search(self):
        mark = True
        while mark:
            mode = input("按ID查输入1；按姓名查输入2：")
            if mode == "1":
                id = int(input("请输入学生ID："))
            elif mode == "2":
                name = input("请输入学生姓名：")
            else:
                print("您的输入有误，请重新输入！")
                continue  # 重新查询
            value = id if mode == "1" else name
            data = self.__controller.find_student(value)
            if data:
                self.__show_student([data])
            else:
                print("没有此信息...")
            inputMark = input("是否继续查询？（y/n）:")
            if inputMark == "y":
                mark = True
            else:
                mark = False

    '''3 删除学生成绩信息'''

    def __delete(self):
        mark = True  # 标记是否循环
        while mark:
            studentId = int(input("请输入要删除的学生ID："))
            result = self.__controller.remove(studentId)
            if result == "ok":
                print("ID为 %s 的学生信息已经被删除..." % studentId)
            elif result == "no":
                print("没有找到ID为 %s 的学生信息..." % studentId)
            else:  # 不存在学生信息
                print("无学生信息...")
            self.__show()  # 显示全部学生信息
            inputMark = input("是否继续删除？（y/n）:")
            if inputMark == "y":
                mark = True  # 继续删除
            else:
                mark = False  # 退出删除学生信息功能

    def __modify(self):
        self.__show()  # 显示全部学生信息
        studentid = input("请输入要修改的学生ID：")
        if self.__controller.amend(studentid):
            print("找到了这名学生，可以修改他的信息！")
            print("请选择要修改的学生信息：1.姓名，2.英语成绩，3.Python成绩，4.C语言成绩。")
            while True:
                key = input("请选择：")
                if key in ("2", "3", "4"):
                    stu = StudentModel()
                    stu.score = self.__get_number("请输入学生成绩：")
                    new_info = stu.score
                    break
                elif key == "1":
                    new_info = input("请修改学生姓名：")
                    break
                else:
                    print("选择不太行，理解不了呢")
            result = self.__controller.update(int(key), new_info, studentid)
            if result is True:
                print("修改成功！")
            else:
                print(result)
        else:
            print("学生信息不存在")
        mark = input("是否继续修改其他学生信息？（y/n）：")
        if mark == "y":
            self.__modify()  # 重新执行修改操作        递归函数（数据结构）

    def __sort(self):
        self.__show()
        ascORdesc = input("请选择（0升序；1降序）：")
        if ascORdesc not in ("0", "1"):
            print("您的输入有误，请重新输入！")
            self.__sort()
        else:
            mode = input("请选择排序方式（1按英语成绩排序；2按Python成绩排序；3按C语言成绩排序；0按总成绩排序）：")
            if mode not in ("1", "2", "3", "0"):
                print("您的输入有误，请重新输入！")
                self.__sort()
            else:
                student_new = self.__controller.orderby(int(mode), ascORdesc)
                self.__show_student(student_new)

    def __total(self):
        stu_count = self.__controller.have_student()
        print(f"全班总共有{stu_count}人。")

    def __show(self):
        stu_all = self.__controller.all_student()
        self.__show_student(stu_all)

    # 将保存在列表中的学生信息显示出来
    def __show_student(self, studentList):
        if not studentList:
            print("(o@.@o) 无数据信息 (o@.@o) \n")
            return
        format_title = "{:^6}{:^12}\t{:^12}\t{:^12}\t{:^12}\t{:^12}"
        print(format_title.format("ID", "名字", "英语成绩", "Python成绩", "C语言成绩", "总成绩"))
        format_data = "{:^6}{:^12}\t{:^12}\t{:^12}\t{:^12}\t{:^12}"
        for info in studentList:
            print(
                format_data.format(info[0], info[1], str(info[2]), str(info[3]),
                                   str(info[4]),
                                   str(info[2] + info[3] + info[4]).center(12)))

    def __get_number(self, message):
        stu = StudentModel()
        while True:
            try:
                stu.score = int(input(message))
                return stu.score
            except:
                print("输入有误,请输入合法分数")
